package study.top.mydb;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import org.apache.log4j.Logger;

import study.top.common.DBHandler;
import study.top.common.DateTime;
import study.top.mydb.items.PaymentPItem;

/**
 * 결제상품 테이블
 * 
 * 추가(add), 수정(edit), 삭제(delete), 결제상품 하나보기(show),
 * 회원별 결제상품보기(showListMember), 
 * 회원별 결제상품보기에 페이지 추가(pagingShowListMember),
 * 사이트 전체 결제상품보기(showListAll),
 * 장바구니별 결제상품보기(showListPayInfo)
 * 장바구니별 결제상품보기에 페이지 추가(pagingShowListPayInfo)  
 * 
 * @author 김미홍 *
 */
public class PaymentP {
	static Logger logger = Logger.getLogger(PaymentP.class);

	DBHandler db = null;
			
	public PaymentP() {
		db = DBHandler.getInstance();
	}
		
	private static final String TABLE = "payment_p";

	/**
	 * 회원 주문내역을 추가한다.
	 * 
	 * @param payment_Info_seq	장바구니 일련번호
	 * @param product_seq		상품 일련번호
	 * @param docid				상품 코드
	 * @param title				상품 이름
	 * @param qty				상품 개수
	 * @param price				상품 가격
	 * @param imgurl			상품 이미지경로
	 * @param reg_date			DB 등록일
	 * @param edit_date			DB 수정일
	 * @return int seq			생성된 주문내역 일련번호
	 */
	public int add(int payment_Info_seq, int product_seq,
			String docid, String title, int qty, int price, String imgurl,
			String reg_date, String edit_date) {
		logger.debug("==========method start >> add");
		
		logger.debug("[PARAMS] payment_Info_seq=" + payment_Info_seq);
		logger.debug("[PARAMS] product_seq=" + product_seq);
		logger.debug("[PARAMS] docid=" + docid);
		logger.debug("[PARAMS] title=" + title);
		logger.debug("[PARAMS] qty=" + qty);
		logger.debug("[PARAMS] price" + price);
		logger.debug("[PARAMS] imgurl=" + imgurl);
		logger.debug("[PARAMS] reg_date=" + reg_date);
		logger.debug("[PARAMS] edit_date=" + edit_date);

		int seq = -1;
		
		// SQL 인젝션 방어
		title = title.replace("'", "\'");
		imgurl = imgurl.replace("'", "\'");
		
		// 트랜젝션
		db.beginTrans();
		
		// sql
				// INSERT INTO payment_p (docid, title, description, qty, price_min, price_max, publish_date, maker, brand, imgurl, recommend, is_open, category2_seq, reg_date, edit_date) 
				// VALUE ('E1086394739', '쥬크 카라배색 롱가디건 [Z134KSL702]', '쥬크 카라배색 롱가디건 [Z134KSL702]', 133480, 179400, 20130513, '쥬크', '쥬크', 'http://i1.daumcdn.net/thumb/R140x140/?fname=http%3A//i1.daumcdn.net/svc/image/U03/shophow/E1086394739.jpg', 100, 'Y', 1, '20131125115700', '20131125115700');
		String sql = "INSERT INTO payment_p "
				+ "(payment_Info_seq, product_seq, docid, title, qty, price, "
				+ "imgurl, reg_date, edit_date) "
				+ "VALUES (%d, %d, '%s', '%s', %d, %d, '%s', '%s', '%s')";
		
		String date = DateTime.getInstance().getNowDateTimeString();
		
		seq = db.getMax(TABLE, "seq", null) + 1;
		
		boolean result = db.execSql(sql, payment_Info_seq, product_seq, docid, title, qty, price,
				imgurl, date, date);
		
		if(result) {
			db.commit();
			logger.debug("처리결과 >> " + docid + "상품 결제 성공");
		} else {
			db.rollback();
			logger.error("처리결과 >> 상품 결제 실패");
		}
		
		logger.debug("==========method end >> add");
		return seq;
	}	
	
	/**
	 * 회원의 주문내역을 수정한다.
	 * 
	 * @param seq				주문내역 일련번호
	 * @param payment_Info_seq	장바구니 일련번호
	 * @param product_seq		상품 일련번호
	 * @param docid				상품 코드
	 * @param title				상품 이름
	 * @param qty				상품 개수
	 * @param price				상품 가격
	 * @param imgurl			상품 이미지경로
	 * @param reg_date			DB 등록일
	 * @param edit_date			DB 수정일
	 * @return boolean result	수정 여부
	 */
	public boolean edit(int seq, int payment_Info_seq, int product_seq,
			String docid, String title, int qty, int price, String imgurl,
			String reg_date, String edit_date) {
		logger.debug("==========method start >> edit");
			
		logger.debug("[PARAMS] seq=" + seq);
		logger.debug("[PARAMS] payment_Info_seq=" + payment_Info_seq);
		logger.debug("[PARAMS] product_seq=" + product_seq);
		logger.debug("[PARAMS] docid=" + docid);
		logger.debug("[PARAMS] title=" + title);
		logger.debug("[PARAMS] qty=" + qty);
		logger.debug("[PARAMS] price" + price);
		logger.debug("[PARAMS] imgurl=" + imgurl);
		logger.debug("[PARAMS] reg_date=" + reg_date);
		logger.debug("[PARAMS] edit_date=" + edit_date);
		
		boolean result = false;

		// SQL 인젝션 방어
		title = title.replace("'", "\'");
		imgurl = imgurl.replace("'", "\'");
		
		db.beginTrans();
		
		// sql
		String sql = "UPDATE payment_p SET payment_Info_seq=%d, product_seq=%d, docid='%s', "
				+ "title='%s', qty=%d, price=%d, imgurl='%s', "
				+ "recommend=%d, reg_date='%s', edit_date='%s' "
				+ "WHERE seq=%d;";
		
		String date = DateTime.getInstance().getNowDateTimeString();
		
		result = db.execSql(sql, payment_Info_seq, product_seq, docid, title,
				qty, price, imgurl, date, date, seq);
		
		if(result) {
			db.commit();
			logger.debug("처리결과 >> " + seq + "번 주문내역 수정 성공");
		} else {
			db.rollback();
			logger.error("처리결과 >> 주문내역 수정 실패");
		}
		
		logger.debug("==========method end >> edit");		
		return result;
	}
	
	/**
	 * 회원이 결제 취소한 내역을 삭제한다.
	 * 
	 * @param seq				주문상품 1건 일련번호
	 * @return boolean result	삭제 여부
	 */
	public boolean delete(int seq) {
		logger.debug("==========method start >> delete");

		logger.debug("[PARAMS] seq=" + seq);

		boolean result = false;
		
		db.beginTrans();
		
		// sql
		// DELETE FROM payment_p WHERE seq=1;
		String sql = "DELETE FROM payment_p WHERE seq=%d";
		result = db.execSql(sql, seq);
		
		if(result) {
			db.commit();
			logger.debug("처리결과 >> " + seq + "번 주문내역 삭제 성공");
		} else {
			db.rollback();
			logger.error("처리결과 >> 주문내역 삭제 실패");
		}
		
		logger.debug("==========method end >> delete");		
		return result;
	}
	/**
	 * 회원이 결제한 상품 1건을 검색해서 보여준다.
	 * 
	 * @param seq 				주문내역 일련번호
	 * @return PaymentPItem item	결제한 상품
	 */
	public PaymentPItem show(int seq) {
		logger.debug("==========method start >> show");
				
		logger.debug("[PARAMS] seq=" + seq);	
		
		PaymentPItem item = null;

		// sql
		String sql = "SELECT seq, payment_Info_seq, product_seq, docid, title, qty, price, imgurl, reg_date, edit_date "
				+ "FROM payment_p WHERE seq=%d ORDER BY seq desc";
				
		ResultSet rs = db.getResult(sql, seq);
		
		if(rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				rs.next();
					
				// 1) ResultSet의 모든 데이터를 변수로 추출
				int no = rs.getInt(1);
				int payment_Info_seq = rs.getInt(2);
				int product_seq = rs.getInt(3);
				String docid = rs.getString(4);
				String title = rs.getString(5);
				int qty = rs.getInt(6);
				int price = rs.getInt(7);
				String imgurl = rs.getString(8);
				String reg_date = rs.getString(9);
				String edit_date = rs.getString(10);
								
				// 2) 추출된 값을 객체로 구성
				item = new PaymentPItem(no, payment_Info_seq, product_seq, docid, title, qty, price, imgurl, reg_date, edit_date);
						
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 3) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {}
				rs = null;
			}
		}
			
		if(item == null) {
			logger.error("결제한 상품 1건 조회 실패");
		} else {
			logger.debug("결제한 상품 1건 조회 성공");
			logger.debug(item.toString());
		}
		
		logger.debug("==========method end >> show");		
		return item;
	}
	
	/**
	 * 회원이 주문했던 모든 상품 내역을 보여준다.
	 * 
	 * @param member_seq		PaymentInfo 테이블의 회원번호
	 * @return	ArrayList<PaymentItem> 회원 한명의 결제 리스트
	 */
	public ArrayList<PaymentPItem> showListMember(int member_seq) {
		logger.debug("==========method start >> showListMember");
		
		logger.debug("[PARAMS] member_seq=" + member_seq);
		
		ArrayList<PaymentPItem> list = null;
		
		// sql
		String sql = "SELECT pp.seq, payment_Info_seq, product_seq, docid, title, qty, "
				+ "price, imgurl, pp.reg_date, pp.edit_date "
				+ "FROM payment_p pp, payment_Info pi WHERE pp.payment_Info_seq=pi.seq AND pi.member_seq=%d ORDER BY pp.seq desc";
	
		ResultSet rs = db.getResult(sql, member_seq);
				
		if(rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				list = new ArrayList<PaymentPItem>();
						
				while(rs.next()) {
							
					// 1) ResultSet의 모든 데이터를 변수로 추출
					int no = rs.getInt(1);
					int payment_Info_seq = rs.getInt(2);
					int product_seq = rs.getInt(3);
					String docid = rs.getString(4);
					String title = rs.getString(5);
					int qty = rs.getInt(6);
					int price = rs.getInt(7);
					String imgurl = rs.getString(8);
					String reg_date = rs.getString(9);
					String edit_date = rs.getString(10);
					
					// 2) 추출된 값을 객체로 구성
					PaymentPItem item = new PaymentPItem(no, payment_Info_seq, product_seq, docid, title, qty, price, imgurl, reg_date, edit_date);
					
					// 3) ArrayList에 추가
					list.add(item);
				}
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 4) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {}
				rs = null;
			}
		}
		
		if(list == null) {
			logger.error("회원별 주문상품 조회 실패");
		} else {
			logger.debug("회원별 주문상품 조회 성공 >> " + list.size() + "건 조회됨");
		}
				
		logger.debug("==========method end >> showListMember");		
		return list;
	}
	
	/**
	 * 회원이 주문했던 모든 상품내역에 페이지 추가
	 * 
	 * @param member_seq		PaymentInfo 테이블의 회원번호
	 * @param start				
	 * @param end
	 * 
	 * @return	ArrayList<PaymentItem> 회원 한명의 결제 리스트
	 */
	public ArrayList<PaymentPItem> pagingShowListMember(int member_seq, int start, int end) {
		logger.debug("==========method start >> pagingShowListMember");
		
		logger.debug("[PARAMS] member_seq=" + member_seq);
		
		ArrayList<PaymentPItem> list = null;
		
		// sql
		String sql = "SELECT pp.seq, payment_Info_seq, product_seq, docid, title, qty, "
				+ "price, imgurl, pp.reg_date, pp.edit_date "
				+ "FROM payment_p pp, payment_Info pi WHERE pp.payment_Info_seq=pi.seq AND pi.member_seq=%d "
				+ "ORDER BY pp.seq desc LIMIT %d, %d";
	
		ResultSet rs = db.getResult(sql, member_seq, start, end);
				
		if(rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				list = new ArrayList<PaymentPItem>();
						
				while(rs.next()) {
							
					// 1) ResultSet의 모든 데이터를 변수로 추출
					int no = rs.getInt(1);
					int payment_Info_seq = rs.getInt(2);
					int product_seq = rs.getInt(3);
					String docid = rs.getString(4);
					String title = rs.getString(5);
					int qty = rs.getInt(6);
					int price = rs.getInt(7);
					String imgurl = rs.getString(8);
					String reg_date = rs.getString(9);
					String edit_date = rs.getString(10);
					
					// 2) 추출된 값을 객체로 구성
					PaymentPItem item = new PaymentPItem(no, payment_Info_seq, product_seq, docid, title, qty, price, imgurl, reg_date, edit_date);
					
					// 3) ArrayList에 추가
					list.add(item);
				}
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 4) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {}
				rs = null;
			}
		}
		
		if(list == null) {
			logger.error("회원별 주문상품 조회 실패");
		} else {
			logger.debug("회원별 주문상품 조회 성공 >> " + list.size() + "건 조회됨");
		}
				
		logger.debug("==========method end >> pagingShowListMember");		
		return list;
	}
	
	/**
	 * TOP에서 주문된 모든 상품내역을 보여준다.
	 * 
	 * @return	ArrayList<PaymentItem> 모든 결제 리스트
	 */
	public ArrayList<PaymentPItem> showListAll() {
		logger.debug("==========method start >> showListAll");
		
		ArrayList<PaymentPItem> list = null;
		
		// sql - 수정
		String sql = "SELECT seq, payment_Info_seq, product_seq, docid, title, qty, "
				+ "price, imgurl, reg_date, edit_date "
				+ "FROM payment_p ORDER BY seq desc";
		
		ResultSet rs = db.getResult(sql);
						
		if(rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				list = new ArrayList<PaymentPItem>();
						
				while(rs.next()) {
								
					// 1) ResultSet의 모든 데이터를 변수로 추출
					int no = rs.getInt(1);
					int payment_Info_seq = rs.getInt(2);
					int product_seq = rs.getInt(3);
					String docid = rs.getString(4);
					String title = rs.getString(5);
					int qty = rs.getInt(6);
					int price = rs.getInt(7);
					String imgurl = rs.getString(8);
					String reg_date = rs.getString(9);
					String edit_date = rs.getString(10);
							
					// 2) 추출된 값을 객체로 구성
					PaymentPItem item = new PaymentPItem(no, payment_Info_seq, product_seq, docid, title, qty, price, imgurl, reg_date, edit_date);
					
					// 3) ArrayList에 추가
					list.add(item);
				}
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 4) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {}
				rs = null;
			}
		}
				
		if(list == null) {
			logger.error("결제상품 조회 실패");
		} else {
			logger.debug("결제상품 조회 성공 >> " + list.size() + "건 조회됨");
		}
				
		logger.debug("==========method end >> showListAll");		
		return list;
	}
	
	/**
	 * 회원이 주문한 주문1건에 대한 상품 내역을 보여준다.
	 * 
	 * @param pay_seq					PaymentInfo 테이블의 주문번호(seq)
	 * @return	ArrayList<PaymentItem> 	회원 한명의 결제 리스트
	 */
	public ArrayList<PaymentPItem> showListPayInfo(int pay_seq) {
		logger.debug("==========method start >> showListPayInfo");
		
		logger.debug("[PARAMS] pay_seq=" + pay_seq);
		
		ArrayList<PaymentPItem> list = null;
		
		// sql
		String sql = "SELECT pp.seq, payment_Info_seq, product_seq, docid, title, qty, "
				+ "price, imgurl, pp.reg_date, pp.edit_date "
				+ "FROM payment_p pp, payment_Info pi WHERE pp.payment_Info_seq=pi.seq AND pp.payment_Info_seq=%d ORDER BY pp.seq desc";
	
		ResultSet rs = db.getResult(sql, pay_seq);
				
		if(rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				list = new ArrayList<PaymentPItem>();
						
				while(rs.next()) {
							
					// 1) ResultSet의 모든 데이터를 변수로 추출
					int no = rs.getInt(1);
					int payment_Info_seq = rs.getInt(2);
					int product_seq = rs.getInt(3);
					String docid = rs.getString(4);
					String title = rs.getString(5);
					int qty = rs.getInt(6);
					int price = rs.getInt(7);
					String imgurl = rs.getString(8);
					String reg_date = rs.getString(9);
					String edit_date = rs.getString(10);
					
					// 2) 추출된 값을 객체로 구성
					PaymentPItem item = new PaymentPItem(no, payment_Info_seq, product_seq, docid, title, qty, price, imgurl, reg_date, edit_date);
					
					// 3) ArrayList에 추가
					list.add(item);
				}
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 4) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {}
				rs = null;
			}
		}
		
		if(list == null) {
			logger.error("회원별 주문상품 조회 실패");
		} else {
			logger.debug("회원별 주문상품 조회 성공 >> " + list.size() + "건 조회됨");
		}
				
		logger.debug("==========method end >> showListPayInfo");		
		return list;
	}
	
	/**
	 * 회원이 주문한 주문1건에 대한 상품 내역에 페이지 추가
	 * 
	 * @param pay_seq					PaymentInfo 테이블의 주문번호(seq)
	 * @param start		페이지의 시작 목록번호
	 * @param end		페이지의 끝 목록번호
	 * @return	ArrayList<PaymentItem> 	회원 한명의 결제 리스트
	 */
	public ArrayList<PaymentPItem> pagingShowListPayInfo(int pay_seq, int start, int end) {
		logger.debug("==========method start >> pagingShowListPayInfo");
		
		logger.debug("[PARAMS] pay_seq=" + pay_seq);
		logger.debug("[PARAMS] start=" + start);
		logger.debug("[PARAMS] end=" + end);
		
		ArrayList<PaymentPItem> list = null;
		
		// sql
		String sql = "SELECT pp.seq, payment_Info_seq, product_seq, docid, title, qty, "
				+ "price, imgurl, pp.reg_date, pp.edit_date "
				+ "FROM payment_p pp, payment_Info pi WHERE pp.payment_Info_seq=pi.seq AND pp.payment_Info_seq=%d "
				+ "ORDER BY pp.seq desc LIMIT %d, %d";
	
		ResultSet rs = db.getResult(sql, pay_seq, start, end);
				
		if(rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				list = new ArrayList<PaymentPItem>();
						
				while(rs.next()) {
							
					// 1) ResultSet의 모든 데이터를 변수로 추출
					int no = rs.getInt(1);
					int payment_Info_seq = rs.getInt(2);
					int product_seq = rs.getInt(3);
					String docid = rs.getString(4);
					String title = rs.getString(5);
					int qty = rs.getInt(6);
					int price = rs.getInt(7);
					String imgurl = rs.getString(8);
					String reg_date = rs.getString(9);
					String edit_date = rs.getString(10);
					
					// 2) 추출된 값을 객체로 구성
					PaymentPItem item = new PaymentPItem(no, payment_Info_seq, product_seq, docid, title, qty, price, imgurl, reg_date, edit_date);
					
					// 3) ArrayList에 추가
					list.add(item);
				}
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 4) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {}
				rs = null;
			}
		}
		
		if(list == null) {
			logger.error("회원별 주문상품 조회 실패");
		} else {
			logger.debug("회원별 주문상품 조회 성공 >> " + list.size() + "건 조회됨");
		}
				
		logger.debug("==========method end >> pagingShowListPayInfo");		
		return list;
	}
}